package j.quartz.ui.common.utils;

import org.apache.commons.lang3.Validate;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.Configuration;

import j.quartz.ui.sys.conf.AppCtxConfig;

@SuppressWarnings("unchecked")

@Configuration
public class SpringContextUtil extends AppCtxConfig {
	private static Logger LOGGER = LoggerFactory.getLogger(SpringContextUtil.class) ;
	
	private static ApplicationContext applicationContext = null;
	
	/**
	 * 取得存储在静态变量中的ApplicationContext.
	 */
	public static ApplicationContext getApplicationContext() {
		assertContextInjected();
		return applicationContext;
	}
	
	/**
	 * 从静态变量applicationContext中取得Bean, 自动转型为所赋值对象的类型.
	 */
	public static <T> T getBean(String name) {
		assertContextInjected();
		return (T) applicationContext.getBean(name);
	}
	
	/**
	 * 从静态变量applicationContext中取得Bean, 自动转型为所赋值对象的类型.
	 */
	public static <T> T getBean(Class<T> requiredType) {
		assertContextInjected();
		return applicationContext.getBean(requiredType);
	}
	
	
	public static void setApplicationCxt(ApplicationContext applicationContext) {
		SpringContextUtil.applicationContext = applicationContext;
	}
	
	
	/**
	 * 清除SpringContextUtil中的ApplicationContext为Null.
	 */
	public static void clearHolder() {
		if (LOGGER.isDebugEnabled()) {
			LOGGER.debug("清除SpringContextUtil中的ApplicationContext:" + applicationContext);
		}
		applicationContext = null;
	}
	
	/**
	 * 检查ApplicationContext不为空.
	 */
	private static void assertContextInjected() {
		Validate.validState(applicationContext != null, "applicaitonContext属性未注入, 请在applicationContext.xml中定义SpringContextUtil.");
	}
	

}
